Description
MoveUp/MoveDown via applyGoal: when goalCol clamps to min(goalCol, target.runes) and the target is a non-last wrap segment ending in a trailing space (e.g. 'aaaa ' runes=5), landing at col=start+5 == start of the NEXT segment, so cursorVIndex maps to the row after the intended one โ arrow visibly skips a row. No buffer/state corruption; logical position is sensible. Fix: clamp non-last segments to runes-1 at a soft-wrap boundary, or special-case the trailing-space column. Add a regression test pinning intended behavior.
Acceptance Criteria
- #1 vertical move lands on the visually-adjacent row at wrap boundaries
- #2 regression test added